Когда-то мы создали функцию CloseAlias(). Настало время написать функцию OpenTable():
#INCLUDE .\Include \Define.H
*
* function OpenTable
* передаем имя таблицы или путь к ней и псевдоним
lparameters strLocPrmTable, strLocPrmAlias
*
local intLocReturnWorkArea, intLocCount, objLocWorkArea
* инициализируем код возврата
intLocReturnWorkArea = 0
* проверяем наличие файла на диске
if file(strLocPrmTable)
* цикл по объектам рабочих областей с целью найти свободный
for intLocCount = 1 to DEF_MAXWORKAREA
* проверка открытой таблицы в рабочей области
if .not. used(intLocCount)
use (strLocPrmTable) in intLocCount again alias (strLocPrmAlias)
* проверяем успешность открытия таблицы с заданным псевдонимом
if used(strLocPrmAlias)
* обращаемся к соответствующему объекту рабочей области
objLocWorkArea = arrPblWorkArea[intLocCount]
* проверяем тип объекта
if (type(objLocWorkArea) = "O")
* это мы делали при инициализации объекта, но можно и повторить
objLocWorkArea.intPrpWorkArea = intLocCount
* свойство псевдоним рабочей области
objLocWorkArea.strPrpAlias = strLocPrmAlias
* свойство файл DBF
objLocWorkArea.strPrpDBF = dbf(intLocCount)
* инициализируем код возврата номером рабочей области
intLocReturnWorkArea = intLocCount
endif
endif
* выходим из цикла
exit
endif
endfor
endif
return intLocReturnWorkArea
Функциональность объекта рабочей области можно наращивать добавлением новых свойств и методов. А для получения уникального псевдонима напишем очень короткую функцию GetNewAlias():
* * function GetNewAlias * возвращаем уникальное имя return "Alias" + sys(2015)
Для перехода в рабочую область с указанным псевдонимом напишем функцию SelectAlias():
*
* function SelectAlias
lparameter strLocPrmAlias
local logLocReturn
logLocReturn = .F.
if used(strLocPrmAlias)
select (strLocPrmAlias)
logLocReturn = .T.
endif
return logLocReturn
*
Использование нашей функции в программе будет выглядеть следующим образом:
*
local strLocNewAlias
* запоминаем псевдоним для дальнейшего использования
strLocNewAlias = GetNewAlias()
if (OpenTable(".\System\T_Users.DBF", strLocNewAlias) > 0) .and. SelectAlias(strLocNewAlias)
scan
::::::
:::..
endscan
endif
CloseAlias(strLocNewAlias)
Обратите внимание на команды
use (strLocPrmTable) in (intLocCount) again alias (strLocPrmAlias)
и
select (strLocPrmAlias)
Они могли бы быть написаны и по-другому, с использованием макроподстановки:
use &strLocPrmTable in intLocCount again alias &strLocPrmAlias select strLocPrmAlias
Макроподстановка иногда очень удобна. Но для работы с таблицами и псевдонимами рекомендуется использовать вариант со скобками. В документации сказано, что это работает быстрее.
После окончания работы с таблицей не забывайте ее закрывать функцией CloseAlias(). В большом проекте может быть и 100, и 200, и 300 таблиц. Открывать их все при старте программы и закрывать при выходе - НЕ самое лучшее решение. Лучше открывать их динамически в зависимости от логики приложения и действий пользователя.